package cn.tedu.justone.pack02;

/**
 * ZZ：JustOne
 * VX：Andylau2020smile
 * DY：JustOne2018
 * ZT：《》
 */
public class Demo30_生产者消费者模式01 {
    //生产者消费者模式
    //生产者消费者模式
    //生产者消费者模式
    //wait/notify机制最经典的案例就是 "生产者与消费者"模式。此模式有几种变形以及一些使用注意事项。

    //
    //本Demo用于演示生产者消费者模式01，大概思路：
    // 1,共享数据类ValueObject.java里面有个共享数据value
    // 2,生产者P，如果发现value有值，就进入wait。如果发现value无值，就开始生产 并notify消费者C来消费
    // 3,消费者C，如果发现value无值，就进入wait。如果发现value有值，就开始消费 并notify生产者P来生产
    // 4,本示例是1个生产者和1个消费者进行数据的交互，在控制台中打印的日志可以看到get和set是交替运行的。

    public static void main(String[] args) {

        String lock = "刘景景";
        P p = new P(lock);
        C c = new C(lock);

        Thread tp = new Thread(){
            @Override
            public void run() {
                while(true){
                    p.setValue();
                }
            }
        };

        Thread tc = new Thread(){
            @Override
            public void run() {
                while(true){
                    c.getValue();
                }
            }
        };

        tp.start();
        tc.start();

    }

}

//共享数据
class ValueObject{
    public static String value = "";
}

//生产者
class P{
    private String lock;

    public P(String lock){
        this.lock = lock;
    }

    public void setValue(){
        try{
            synchronized (lock){
                //如果value有值，我就wait
                if( !(ValueObject.value.equals("")) ){
                    lock.wait();
                }
                //如果value无值，我就生产，并赋给value
                String value = System.currentTimeMillis() +"_" + System.nanoTime();
                System.out.println("set的值是" + value);
                ValueObject.value = value;
                //value已经有值了，可以喊消费者来消费了
                lock.notify();
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

//消费者
class C{
    private String lock;

    public C(String lock){
        this.lock = lock;
    }

    public void getValue(){
        try{
            synchronized (lock){
                //如果value无值，我就等待
                if(ValueObject.value.equals("")){
                    lock.wait();
                }
                //如果value有值，我就获取并消费掉
                System.out.println("get的值是" + ValueObject.value);
                ValueObject.value = "";
                //value的值已经被我消费掉了，可以喊生产者开始生产了
                lock.notify();
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}




























